package com.hsylient.javase.chapter14.symmetric;

import cn.hutool.core.codec.Base64;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
import cn.hutool.crypto.symmetric.SymmetricCrypto;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

import java.util.Arrays;

/**
 * 对称加密
 * 原文：1234
 * 加密算法：每个数字加一
 * 密文：2345
 */
@Slf4j
public class SymmetricEncryptionTest {

    /**
     * 测试自定义的加密算法
     */
    @Test
    public void testEncryptionByMyself() {
        String source = "1234";
        System.out.println(encryptionByMyself(source));
    }

    /**
     * 每个数字都加一
     *
     * @param source 原数字
     * @return 加1后的结果
     */
    public String encryptionByMyself(String source) {
        if (StrUtil.isBlank(source)) throw new IllegalArgumentException("参数为NULL");
        String[] charString = StrUtil.split(source, 1);
        StringBuilder target = new StringBuilder();
        for (String s : charString) {
            target.append(Integer.parseInt(s) + 1);
        }
        return target.toString();
    }


    /**
     * 注意这一段代码中随机生成的密钥，需要保存起来的。不要将上一次的运行结果，放在下一次去解密，解不开，因为两次运行生成了两个密钥
     */
    @Test
    public void testAES() {

        String content = "test中文";

        //随机生成密钥
        byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();

        //构建
        SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.AES, key);

        // 加密
        byte[] encrypt = aes.encrypt(content);

        // 解密
        byte[] decrypt = aes.decrypt(encrypt);
        System.out.println(new String(decrypt));

        // 加密成十六进制的字符串
        String hexEncrypt = aes.encryptHex(content);
        System.out.println(hexEncrypt);

        // 解密字符串：b0ed4f1da5aa1d34a7a36eaeae798fdc
        String decryptStr = aes.decryptStr(hexEncrypt);
        System.out.println(decryptStr);
    }

    @Test
    public void testDES() {
        String content = "test中文";

        //随机生成密钥
        byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.DES.getValue()).getEncoded();
        log.info("DES对称加密的密钥：{}", Base64.encodeUrlSafe(key));

        //构建
        SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.DES, key);

        // 加密
        byte[] encrypt = aes.encrypt(content);
        log.info("[{}]被DES加密后的字节数组:{}", content, Arrays.toString(encrypt));

        // 解密
        byte[] decrypt = aes.decrypt(encrypt);
        log.info("被DES加密后的字节数组{}, 被揭密后得到的原为：{}", encrypt, new String(decrypt));

        // 加密成十六进制的字符串
        String hexEncrypt = aes.encryptHex(content);
        log.info("被DES加密后的字节数组，转为十六进制的字符串：{}", hexEncrypt);

        // 解密字符串：b0ed4f1da5aa1d34a7a36eaeae798fdc
        String decryptStr = aes.decryptStr(hexEncrypt);
        System.out.println(decryptStr);
    }

}
